Code:
/**
* * structure Object
* */
typedef struct {
int id;
char *name;
} Object;
/**
* * Item of the list
* */
typedef struct item Item;
struct item {
Object data;
Item *next;
};
/**
* * type List
* */
typedef struct {
Item *first;
} List;
/**
* * List initialization. Creates empty list.
* */
List list_ctor()
{
List list;
list.first = NULL;
return list;
}
/**
* * Itinialise item of list. From object creates item without successor.
* */
Item *item_ctor(Object data)
{
Item *item;
item = malloc(sizeof(Item));
item->next = NULL;
item->data = data;
return item;
}
/**
* * Put item to the beggining of list.
* */
void list_insert_first(List * list, Item * i)
{
i->next = list->first;
list->first = i->next;
}
/**
* * Return true, if list is empty.
* */
bool list_empty(List * list)
{
if (list->first == NULL)
return true;
else
return false;
}
/**
* * Remove first element in list, if it is.
* */
void list_delete_first(List * list)
{
Item *item = list->first;
list->first = item->next;
}
/**
* * Returns number of elements in list.
* */
unsigned list_count(List * list)
{
int count = 0;
List *current = list;
while (list != NULL) {
count++;
list->first = current->first;
}
return count;
}
/**
* * Finds item in list with with smallest identifier(id) Returns NULL, if
* * list is empty
* */
Item *list_find_minid(List * list)
{
Item *item;
if (list->first != NULL) {
int min = item->data.id;
while (list->first != NULL) {
if (min > item->data.id) {
min = item->data.id;
return item;
}
}
} else
return NULL;
}
/**
* * Find item in list with corresponding name of object. Returns NULL, if
* * item like that doesn't exist
* */
Item *list_find_name(List * list, char *name)
{
Item *item;
while (list->first != NULL) {
if (strcmp(name, item->data.name) == 0)
return item;
else
return NULL;
}
}
/**
* * Free list.
* */
void list_dtor(List * list)
{
free(list);
}
/*-----------------------------------------------*/
int main()
{
printf("list_ctor...\n");
List list = list_ctor();
printf("list_empty...\n");
printf("Seznam prazdny: %s\n", list_empty(&list) ? "ano" : "ne");
Item *item;
Object o1 = { 42, "Honza" };
printf("item_ctor...\n");
item = item_ctor(o1);
printf("list_insert_first...\n");
list_insert_first(&list, item);
printf("Seznam prazdny: %s\n", list_empty(&list) ? "ano" : "ne");
printf("list_count...\n");
printf("Pocet prvku v seznamu: %d\n", list_count(&list));
Object o2 = { 2, "Malem" };
item = item_ctor(o2);
printf("list_insert_first...\n");
list_insert_first(&list, item);
Object o3 = { 0, "Kralem" };
item = item_ctor(o3);
printf("list_insert_first...\n");
list_insert_first(&list, item);
printf("Pocet prvku v seznamu: %d\n", list_count(&list));
printf("Odstraneni prvniho prvku ze seznamu \n");
list_delete_first(&list);
printf("Pocet prvku v seznamu: %d\n", list_count(&list));
// opetovne vlozeni objektu o1
item = item_ctor(o1);
printf("list_insert_first...\n");
list_insert_first(&list, item);
printf("list_find_minid...\n");
item = list_find_minid(&list);
if (item != NULL) {
printf("Polozka s nejmensim identifikatorem: {%d, " % s "}\n",
item->data.id, item->data.name);
} else
printf("Polozka s nejmensim identifikatorem nenalezena\n");
printf("list_find_name...\n");
char *name = "Honza";
item = list_find_name(&list, name);
if (item != NULL) {
printf("Polozka s daty %s nalezena\n", name);
} else
printf("Polozka s daty %s nenalezena.\n", name);
printf("list_dtor...\n");
list_dtor(&list);
printf("Seznam prazdny: %s\n", list_empty(&list) ? "ano" : "ne");
return 0;
}